package cn.good.yan.controller;

import cn.good.yan.entity.User;
import cn.good.yan.entity.UserLogin;
import cn.good.yan.entity.Re;
import cn.good.yan.service.UserService;
import org.springframework.security.crypto.bcrypt.BCryptPasswordEncoder;
import org.springframework.security.crypto.password.PasswordEncoder;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestBody;
import org.springframework.web.bind.annotation.RestController;

import javax.annotation.Resource;
import javax.servlet.http.HttpServletRequest;
import java.security.Principal;

/**
 * 登录逻辑
 *
 * @author shengren.yan
 * @create 2024-07-16
 */
@RestController
public class LoginController {

    // 用户Server
    @Resource
    public UserService service;


    // 登录逻辑，登录成功后返回 token
    // 前端后续，每次请求，都会把token放到请求头中，后续每次请求都会携带token
    // 登录接口，通过用户查询用户，存在获取对应的角色和权限，进行单点登录、记录登录信息，根据用户名保存到redis中
    @PostMapping("/login")
    public Re login(@RequestBody UserLogin adminLogin, HttpServletRequest request) {
        return service.login(
                adminLogin.getUsername(),
                adminLogin.getPassword(),
                adminLogin.getCode(),
                request);
    }


    // 退出登录 - 一般前端去处理，只要前端清空token，就不再访问成功，有拦截器处理
    @PostMapping("/logout")
    public Re logout() {
        return Re.success("注销成功");
    }

    // 创建用户
    // 請求：http://localhost:9002/add?name=abc
    @GetMapping("/add")
    public User add(String name) {
        return service.add(name);
    }


    // 获取当前登录用户信息
    // Principal 当前登录的对象，前提是在AdminServiceImpl类中login()中 更新security里的用户信息，才可以获取到
    // 如果获取当前登录人信息，可以把用户信息，存到Redis中，从这里获取
    @GetMapping("/admin/info")
    public User getInfo(Principal principal) {
        if (null == principal) {
            return null; // 空就是登录有问题
        }
        String nickname = principal.getName();
        User admin = service.getAdminByUserName(nickname);
        admin.setPassword(null); // 一般密码需要设置空，不能前端暴露
        return admin;
    }


    public static void main(String[] args) {
        // 工作因子，默认值是10，最小值是4，最大值是31，值越大运算速度越慢
        PasswordEncoder pe = new BCryptPasswordEncoder(4);
        // 明文："password"
        // 密文：result，即使明文密码相同，每次生成的密文也不一致
        String result = pe.encode("password");
        System.out.println(result);
        // 验证没问题,返回true,不一致会返回false
        boolean flag = pe.matches("password", result);
        System.out.println(flag);
        // 密码校验  -- 密码不一致
    }


}
